﻿namespace PropOnline.Controllers
{
    using System.Collections.Generic;
    using System.Linq;
    using System.Web.Mvc;
    using PropOnline.Helpers;
    using PropOnline.Models;
    using PropOnline.Stores;    
    using PropOnline.ViewModels.Propiedad;
    using PropOnline.ViewModels.Shared;

    [Authorize]
    public class DueñosController : BusquedaBaseController<BusquedaBarrioCalleMapaViewModel, ResultadoBarrioCalleMapaViewModel>
    {      
        protected override BusquedaBarrioCalleMapaViewModel CompleteBusquedaViewModel(BusquedaBarrioCalleMapaViewModel busquedaViewModel)
        {
            busquedaViewModel.BarriosOptions = BusquedaHelper.FillBarriosOptions(busquedaViewModel.BarriosOptions);

            return busquedaViewModel;
        }

        protected override ResultadoBarrioCalleMapaViewModel GetResultadoViewModel(BusquedaBarrioCalleMapaViewModel busquedaViewModel)
        {
            return new ResultadoBarrioCalleMapaViewModel
            {
                BusquedaViewModel = busquedaViewModel,
                BusquedaCurrentUrl = Url.Action(null, BusquedaHelper.GetBusquedaRouteValues(busquedaViewModel)),
            };
        }

        protected override ResultadoPropiedadesViewModel GetResultadoPropiedadesViewModel(BusquedaBarrioCalleMapaViewModel busquedaDueños)
        {
            if (!busquedaDueños.CantidadResultados.HasValue)
            {
                busquedaDueños.CantidadResultados = 0;
            } 

            return new ResultadoPropiedadesViewModel
            {
                Propiedades = this.BuscarDueños(busquedaDueños),
                RetryBusquedaUrl = Url.Action("Buscar", BusquedaHelper.GetBusquedaRouteValues(busquedaDueños)),
                CantidadResultadosSiguientes = busquedaDueños.CantidadResultados + PropOnlineConstants.DefaultPageSize,
                PagingEnabled = true
            };                           
        }

        private IEnumerable<PropiedadResultadoViewModel> BuscarDueños(BusquedaBarrioCalleMapaViewModel busquedaDueños)
        {     
            if (busquedaDueños.TipoBusqueda == (int)TipoBusqueda.Calle)
            {
                return new PropiedadStore().BuscarDueñosPorCalle(busquedaDueños.Calle, busquedaDueños.AlturaMin, busquedaDueños.AlturaMax, busquedaDueños.Ambientes, busquedaDueños.MesesEnMercado, busquedaDueños.PrecioMin, busquedaDueños.PrecioMax, busquedaDueños.Moneda, busquedaDueños.Superficie, busquedaDueños.TipoPropiedad, busquedaDueños.ZonaId, busquedaDueños.Operacion, busquedaDueños.CantidadResultados.Value);
            }
            else
            {
                int[] barrios = new int[0];
                if (busquedaDueños.BarriosOptions != null)
                {
                    barrios = 
                        busquedaDueños
                        .BarriosOptions
                        .Where(b => b.IsChecked)
                        .Union(busquedaDueños.BarriosOptions.SelectMany(b => b.Hijos.Where(h => h.IsChecked)))
                        .Select(b => b.Id).ToArray();                                      
                }

                return new PropiedadStore().BuscarDueñosPorBarrios(barrios, busquedaDueños.Ambientes, busquedaDueños.MesesEnMercado, busquedaDueños.PrecioMin, busquedaDueños.PrecioMax, busquedaDueños.Moneda, busquedaDueños.Superficie, busquedaDueños.TipoPropiedad, busquedaDueños.ZonaId, busquedaDueños.Operacion, busquedaDueños.CantidadResultados.Value);
            }            
        }  
    }
}
